'use strict';

module.exports = (app) => {
  class CommentService extends app.Service {
    // 评论
    async create() {
      const { app, ctx } = this;
      const { User, Comment, Blog } = app.model.Tables.Blog;

      const data = ctx.request.body;
      // 如果是回复 需要先查看父评论是否存在
      let res;
      if (ctx.request.body.parentCommentId) {
        const isParent = await Comment.findByPk(
          ctx.request.body.parentCommentId
        );
        if (!isParent) {
          return '该评论不存在';
        }
        // 查找评论的人的信息
        const uRes = await User.findByPk(ctx.userInfo.id);
        // 查找作者
        const find = await Blog.findByPk(data.blogId);

        // 创建评论信息
        res = await Comment.create({
          // 评论/回复的人的信息
          userId: ctx.userInfo.id,
          userName: uRes.dataValues.name,
          userAvatar:
            uRes.dataValues.avatar ||
            'http://blog.bluej.cn/static/img/logo.5f6c094d.jpg',
          // 被回复的人的信息
          beRepliedUserId: isParent.dataValues.userId,
          beRepliedUserName: isParent.dataValues.userName,
          beRepliedUserAvatar: isParent.dataValues.userAvatar,
          // 博客信息
          blogId: data.blogId,
          content: data.content,
          authorId: find.dataValues.userId,
          parentCommentId: data.parentCommentId,
          // 项目信息
          projectId: data.projectId,
        });
        if (res) {
          // 被回复的人的回复次数+1
          await User.findByPk(isParent.dataValues.userId).then(function (user) {
            user.increment('replyCount').then(function () {
              console.log('success');
            });
          });
        }
      } else {
        // 查找评论的人的信息
        const uRes = await User.findByPk(ctx.userInfo.id);
        // 查找作者
        const find = await Blog.findByPk(data.blogId);
        if (!find) {
          return '文章不存在';
        }

        // 创建评论信息
        res = await Comment.create({
          // 评论/回复的人的信息
          userId: ctx.userInfo.id,
          userName: uRes.dataValues.name,
          userAvatar:
            uRes.dataValues.avatar ||
            'http://blog.bluej.cn/static/img/logo.5f6c094d.jpg',
          // 博客信息
          blogId: data.blogId,
          content: data.content,
          authorId: find.dataValues.userId,
          parentCommentId: data.parentCommentId,
          // 项目信息
          projectId: data.projectId,
        });
      }

      // 如果成功 用户的评论数自增1 博客的评论数自增1
      if (res) {
        await User.findByPk(ctx.userInfo.id).then(function (user) {
          user.increment('commentCount').then(function () {
            console.log('success');
          });
        });
        await Blog.findByPk(data.blogId).then(function (blog) {
          blog.increment('comment_count').then(function (blog) {
            console.log('success');
          });
        });
      }
      return res;
    }
    // 获取自己创建的评论
    async getMyComment() {
      const { app, ctx } = this;
      const { User, Comment, Blog, Project } = app.model.Tables.Blog;
      const data = ctx.query;
      // // 获取token
      // const token = ctx.get('x-token');
      // const decode = app.jwt.decode(token);
      // // 验证项目id
      // const projectRes = await Project.findOne({
      //   where: {
      //     id: data.projectId,
      //   },
      // });
      // if (!projectRes) {
      //   return '项目id错误';
      // }

      const res = Comment.findAndCountAll({
        where: {
          userId: ctx.userInfo.id,
          projectId: ctx.userInfo.projectId,
        },
        limit: Number(data.limit) || 10,
        offset: Number(data.offset) || 0,
        order: [['updatedAt', 'desc']],
      });
      return res;
    }
    // 获取我的回复
    async getMyReply() {
      const { app, ctx } = this;
      const { Comment } = app.model.Tables.Blog;
      const data = ctx.query;

      // 查找
      const res = Comment.findAndCountAll({
        where: {
          beRepliedUserId: ctx.userInfo.id,
          projectId: ctx.userInfo.projectId,
        },
        limit: Number(data.limit) || 10,
        offset: Number(data.offset) || 0,
        order: [['updatedAt', 'desc']],
      });
      return res;
    }

    // 获取当前博客评论
    async get() {
      const { app, ctx } = this;
      const { Comment, Project } = app.model.Tables.Blog;
      const data = ctx.query;

      // 查找
      const res = await Comment.findAndCountAll({
        where: {
          blogId: data.id,
          projectId: ctx.userInfo.projectId,
        },
        limit: Number(data.limit) || 10,
        offset: Number(data.offset) || 0,
        order: [['createdAt', 'desc']],
      });
      return res;
    }

    // 删除评论(管理员 博客作者 评论的人)
    async delete() {
      const { app, ctx } = this;
      const { User, Comment, Blog } = app.model.Tables.Blog;
      const { Admin } = app.model.Tables.Com;
      const data = ctx.request.body;

      // 根据评论id找到该评论
      const find = await Comment.findByPk(Number(data.id));
      if (!find) {
        return '评论不存在';
      }
      // 管理员查询
      const aRes = await Admin.findByPk(ctx.userInfo.id);
      // 如果userId和解密token的id相对应或者是作者、管理员则可以删除
      if (
        ctx.userInfo.id == find.dataValues.userId ||
        ctx.userInfo.id == find.dataValues.authorId ||
        ctx.userInfo.id == aRes.dataValues.id
      ) {
        const res = await Comment.destroy({
          where: {
            id: data.id,
            projectId: data.projectId,
          },
        });
        // 如果删除成功 评论的用户评论数自减1 博客评论数自减1
        if (res) {
          await User.findByPk(find.dataValues.userId).then(function (user) {
            user.decrement('commentCount').then(function (user) {
              console.log('success');
            });
          });
          await Blog.findByPk(find.dataValues.blogId).then(function (blog) {
            blog.decrement('comment_count').then(function (blog) {
              console.log('success');
            });
          });
          // 如果该评论有回复另一条评论 用户被回复数自减1
          if (data.beRepliedUserId) {
            await User.findByPk(data.beRepliedUserId).then(function (user) {
              user.decrement('replyCount').then(function (user) {
                console.log('success');
              });
            });
          }
        }
        return '删除成功';
      }
      return '删除失败';
    }

    // 点赞评论
    async like() {
      const { app, ctx } = this;
      const { Comment, LikeComment } = app.model.Tables.Blog;
      const data = ctx.request.body;
      // 根据评论id找到该评论
      const find = await Comment.findByPk(data.commentId);
      if (!find) {
        return '该评论不存在';
      }
      // 判断用户是否点赞过此条评论
      const isLike = await LikeComment.findOne({
        where: {
          commentId: data.commentId,
          blogId: data.blogId,
          likeUserId: ctx.userInfo.id,
          projectId: data.projectId,
        },
      });

      if (isLike) {
        // 删除点赞记录
        await LikeComment.destroy({
          where: {
            commentId: data.commentId,
            blogId: data.blogId,
            likeUserId: ctx.userInfo.id,
            projectId: data.projectId,
          },
        });
        // 博客点赞数自减1 如果博客id不存在 直接抛出错误
        await Comment.findByPk(data.commentId).then(function (comment) {
          comment.decrement('likeCount').then(function (comment) {
            console.log('success');
          });
        });
        return '取消点赞成功';
      }

      // 新建点赞记录
      await LikeComment.create({
        commentId: data.commentId,
        blogId: data.blogId,
        likeUserId: ctx.userInfo.id,
        projectId: data.projectId,
      });
      // 评论点赞数自增1
      await Comment.findByPk(data.commentId).then(function (comment) {
        comment.increment('likeCount').then(function (comment) {
          console.log('success');
        });
      });
      return '点赞成功';
    }
  }
  return CommentService;
};
